/*Copyright (C) 2009 - 2011 MASSART GAUTHIER

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef CAS_HEADER
# define CAS_HEADER

#define CAS_PLEIN ACS_BLOCK
#define CAS_POSER 1
#define CAS_HAUTEUR_BLOCK 1
#define CAS_LARGEUR_BLOCK 2
#define CAS_DEBUT_MAT_X 16
#define CAS_DEBUT_MAT_Y 11
#define CAS_DEBUT_POS_X 5
#define CAS_DEBUT_POS_Y 6
#define CAS_VERS_GAUCHE 1
#define CAS_VERS_DROITE 2
#define CAS_VIDE 0
#define CAS_BLOCK 1
#define CAS_POS_TEXT_X 74
#define CAS_V_A_CHANGER 2
#define CAS_B_A_CHANGER 3
#define CAS_NB_BLOCK_DEBUT 4
#define CAS_NB_BLOCK_MAX 5
#define CAS_QUITTER 111

int CAS_LARGEUR_MAT;
int CAS_HAUTEUR_MAT;
int CAS_POS_MAT_X;
int CAS_POS_MAT_Y;

void cas_man(void);

void cas_main(void);

void cas_init(void);

void cas_menu(void);

/* Retourne POSER si l'user appuie sur ESPACE, sinon ERR
** avec nodelay() */
int cas_recupEvent(void);

/* Affiche un block en pos x et y
** par rapport a toute la fenetre
** taille du block = CAS_HAUTEUR/LARGEUR_BLOCK + 2
** affiche un block rouge si coulBool = 1 ou bleu dans le cas contraire */
void cas_afficher_block(int x, int y);

/* Affiche les block de la matrice s'il sont A_CHANGER
** est termine par un refresh() */
void cas_afficher(int matrice[][CAS_HAUTEUR_MAT], int nbAct, int level, int niveau);

/* Bouge dans la matrice la ligne courante et peut inverser le sens */
void cas_bouger(int *x, int *y, int matrice[][CAS_HAUTEUR_MAT], int *sens, int nb);

/* Cree une nouvelle ligne a poser avec "nb" de carre */
void cas_new_line(int *x, int *y, int matrice[][CAS_HAUTEUR_MAT], int *sens, int nb);

/* Animation lorsqu'un block tombe */
void cas_descendre_block_anim(int x, int y, int matrice[][CAS_HAUTEUR_MAT], int nb);

/* Affiche un vide de la taille d'un block a la position x-y */
void cas_afficher_vide(int x, int y);

/* Regarde si un block a ete pose a cote
** appelle descendre_block_anim si necessaire
** retourne le nombre de block restant dans la ligne */
int cas_etat_jeu(int x, int y, int matrice[][CAS_HAUTEUR_MAT], int nb);

/* Animation quand on perd et reinitialise matrice a zero */
void cas_perdu_anim(int matrice[][CAS_HAUTEUR_MAT]);

/* affiche sans couleur un cadre de 2 d'epaisseur sur les cotes gauche et droite */
void cas_afficher_cadre(int x, int y, int w, int h, int car);

/* cree un cadre qui change de taille sur l'axe X. rajoute 'plusX'
** de caracteres de chaque cote. animation */
void cas_resize_cadre_anim(int x, int y, int w, int h, int car, int plusX);

/* active la couleur correspondante au level donne en parametre
** si doubleBool ne vaut pas 0, le texte et l'arriere-plan ont la couleur du level
** si doubleBool vaut 0, seule la couleur du texte et de la couleur du level */
void cas_couleur_level(int level, int doubleBool);

#endif
